| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import { Head } from "fresh/runtime";
- import { page, type PageProps } from "fresh";
- import { find } from "utils/db.ts";
- import { define } from "utils/state.ts";
- import PostList from "../../islands/PostList.tsx";
- import ThemeToggle from "../../islands/ThemeToggle.tsx";
- import PageContainer from "../../components/layout/PageContainer.tsx";
- interface UserPageProps {
- userName: string;
- posts: {
- id: string;
- title: string;
- content: string;
- shared: boolean;
- hasPassword: boolean;
- }[];
- notFound: boolean;
- }
- export const handler = define.handlers({
- GET(ctx) {
- const name = ctx.params.name;
- const user = find("User", { name }, ["id"]);
- if (user.length === 0) {
- return page({ userName: name, posts: [], notFound: true });
- }
- const userId = user[0]["id"] as number;
- const posts = find("Post", { user_id: userId, shared: 1 }, [
- "id",
- "title",
- "content",
- "shared",
- "share_password",
- ]);
- if (posts.length === 0) {
- return page({ userName: name, posts: [], notFound: true });
- }
- return page({
- userName: name,
- posts: posts.map((post) => ({
- id: post["id"] as string,
- title: post["title"] as string,
- content: post["content"] as string,
- shared: post["shared"] === 1,
- hasPassword: Boolean(post["share_password"]),
- })),
- notFound: false,
- });
- },
- });
- export default define.page((props: PageProps<UserPageProps>) => {
- const { userName, posts, notFound } = props.data;
- if (notFound) {
- return (
- <>
- <Head>
- <title>Not Found</title>
- </Head>
- <PageContainer centered>
- <div className="absolute top-3 right-3">
- <ThemeToggle />
- </div>
- <span className="text-xl text-gray-500 dark:text-gray-400">
- Page not found
- </span>
- </PageContainer>
- </>
- );
- }
- return (
- <>
- <Head>
- <title>{userName}'s Shared Posts</title>
- </Head>
- <PageContainer>
- <div className="absolute top-3 right-3">
- <ThemeToggle />
- </div>
- <h1 className="text-2xl font-bold mt-2">{userName}'s Shared Posts</h1>
- <PostList posts={posts} readOnly />
- </PageContainer>
- </>
- );
- });
|